home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NOVA - For the NeXT Workstation
/
NOVA - For the NeXT Workstation.iso
/
Apps
/
Utilities
/
Other
/
Briefcase
/
Briefcase.m
< prev
next >
Wrap
Text File
|
1992-12-26
|
6KB
|
220 lines
#import "Briefcase.h"
#import "BriefDoc.h"
#import "PrefDelegate.h"
#import <appkit/appkit.h>
@implementation Briefcase:MultApp
/* Canon Information Systems is not responsible for anything anyone does with this */
/* code, nor are they responsible for the correctness of this code. Basically, this */
/* has very little to do with the company I work for, and you can't blame them. */
/* This file is best read in a window as wide as this comment, and with tab settings */
/* of 4 spaces and indent setting of 4 spaces (at least, that's what I use). */
/* You are welcome to do as you would with this file under the following conditions. */
/* First, I accept no blame for anything that goes wrong no matter how you use it, */
/* no matter how catastrophic, not even if it stems from a bug in my code. */
/* Second, please keep my notices on it when/if you distribute it. */
/* Third, if you discover any bugs or have any comments, PLEASE TELL ME! Code won't */
/* get better without people picking it apart and giving the writer feedback. */
/* Fourth, if you modify it, please keep a notice that your version is based on mine */
/* in the source files (and keep the notice that mine is based on four other pieces */
/* of code :<). Thanks, and have fun. - Subrata Sircar, ssircar@canon.com */
/* This class is an instance of the application delegate class. */
/* It handles the drag and drop functions, and the communication */
/* with the Workspace. */
/* Version 1.0b Apr-19-92 Third Public Release */
#define MY_VERSION 100
/* Public Methods */
- (int)delay
{
return timeDelay;
}
- setDelay:(int)value;
{
timeDelay = value;
return self;
}
/* Target/Action Methods */
- addFile:sender
/*
* Called by pressing Add File... in the Document menu.
*/
{
char tempBuf[8192];
char fileBuf[MAXPATHLEN+1];
const char *directory;
const char *const *files;
static const char *const myType[1] = {NULL};
id openpanel = [[OpenPanel new] allowMultipleFiles:YES];
sprintf(tempBuf,"");
directory = [[self currentDocument] directory];
if (directory && (*directory == '/')) [openpanel setDirectory:directory];
if ([openpanel runModalForTypes:myType]) {
files = [openpanel filenames];
directory = [openpanel directory];
while (files && *files) {
/* Get pathnames and add them to the current Document */
sprintf(fileBuf,"%s/%s\n",directory,*files);
strcat(tempBuf,fileBuf);
files++;
}
[[self currentDocument] addFiles:tempBuf];
}
return self;
}
/* Automatic update methods */
- (BOOL)validateCommand:menuCell
{
if ([super validateCommand:menuCell]) {
if ([menuCell action] == @selector(addFile:)) return [self currentDocument] ? YES : NO;
else return YES;
} else return NO;
}
/* Application Delegate Methods */
- appWillInit:sender
{
char temp[MAXPATHLEN+1];
/* check and load appropriate defaults */
[super appWillInit:self];
[[self class] setDocClass:[BriefDoc class]];
[[self class] setVersion:MY_VERSION];
if (!NXGetDefaultValue([NXApp appName],LocalString("TimeDelay"))) sprintf(temp,"1000");
else sprintf(temp,NXGetDefaultValue([NXApp appName],LocalString("TimeDelay")));
sscanf(temp,"%d",&timeDelay);
return self;
}
- appWillTerminate:sender
/*
* Overridden to be sure all documents get an opportunity to be saved
* before exiting the program. Save the defaults too.
*/
{
char temp[100];
sprintf(temp,"%d",timeDelay);
NXWriteDefault([NXApp appName],LocalString("TimeDelay"),temp);
return [super appWillTerminate:self];
}
/* WARNING! Hack alert!! */
/* When an application is inactive, the main window has no meaning. Apparently it */
/* also doesn't become active until after the appDidBecomeActive: message is sent. */
/* Hence, I queue up a delayed message such that timeDelay milliseconds after the */
/* application activates, it updates its main window and adds the files then. */
static char myBuf[MAX_STRING_ARRAY];
- pleaseUpdate:sender
{
/* Update the drag/drop files and clear the buffer */
[[self currentDocument] addFiles:myBuf];
*myBuf = '\0';
return self;
}
- appDidBecomeActive:sender
{
return [self perform:@selector(pleaseUpdate:) with:self afterDelay:timeDelay cancelPrevious:YES];
}
/* Listener/Speaker remote methods */
// IconDragging Stuff, oh boy, oh boy!
static char **filePath = NULL;
static int files = 0;
- (int)iconEntered:(int)windowNum at:(double)x :(double)y
iconWindow:(int)iconWindowNum iconX:(double)iconX iconY:(double)iconY
iconWidth:(double)iconWidth iconHeight:(double)iconHeight
pathList:(const char *)pathList
{
char *stringPos, *tempPtr;
char tempBuf[MAXPATHLEN+1];
int count = 0;
if (filePath) {
freeList(filePath);
filePath = NULL;
}
stringPos = tempPtr = (char *)pathList;
files = 0;
/* This code just parses the pathList for the filenames and explictly */
/* null-terminates them after copying into a buffer. It appends that */
/* buffer to the dynamically-allocated filelist which keeps track of it */
/* the number of tabs + 1 equals the number of files dragged in */
while (stringPos = index(stringPos, '\t')) {
count = (int)(stringPos-tempPtr);
strncpy(tempBuf,tempPtr,count);
*(tempBuf+count) = '\0';
filePath = addFile(tempBuf,filePath,files,MyZone);
files++;
stringPos++;
tempPtr=stringPos;
}
strncpy(tempBuf,tempPtr,strlen(tempPtr));
*(tempBuf+strlen(tempPtr)) = '\0';
filePath = addFile(tempBuf,filePath,files,MyZone);
files++;
return 0;
}
- (int)iconExitedAt:(double)x :(double)y
// Erase those files someone waved through our icon
{
freeList(filePath);
filePath = NULL;
files = 0;
return 0;
}
- (int)iconReleasedAt:(double)x :(double)y ok:(int *)flag
// Add the fileList to the buffer which will be added upon activation
{
char tempBuf[MAXPATHLEN+1];
/* accept the icon */
*flag = 1;
while (files--) {
if (*(filePath[files])) {
sprintf(tempBuf,"%s\n",filePath[files]);
strcat(myBuf,tempBuf);
} else {
strcat(myBuf,"/\n"); // Someone waved the hard disk in
}
}
return 0;
}
@end